package liste;

import java.io.Serializable;

import person.Mitarbeiter;

public abstract  class Liste<Typ> implements Listen, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2459189941251219261L;
	Knoten<Typ> head;
	int anzahl;
	long revision;
	
	
	public Liste() {							//Konstruktor
		head = new Knoten<Typ>(null, null);
		anzahl = 0;
		revision = 0;
	}
	
	public Knoten<Typ> getHead() {
		return head;
	}
	public void setHead(Knoten<Typ> head) {
		this.head = head;
	}
	public int getAnzahl() {
		return anzahl;
	}
	public void setAnzahl(int anzahl) {
		this.anzahl = anzahl;
	}
	
	
	public boolean vorneAnfuegen(Typ element) {
		Knoten<Typ> mi = new Knoten<Typ>(element, null);
		if (this.anzahl == 0) {
			head.setNaechster(mi);
			anzahl++;
		} else {
			// Sind bereits Elemenet vorhanden, so wird Zeiger vom neuen Element
			// auf Zeiger von HEad gesetzt

			mi.setNaechster(head.getNaechster());

			// Head Zeiger zeigt auf neues Element
			head.setNaechster(mi);
			anzahl++;
		}
		return true;

	}

	public boolean vorneLoeschen() {
		if (this.anzahl == 0)
			return false;
		// Entferne Knoten durch Umsetzen des Kopfes
		this.head = this.head.getNaechster();
		this.anzahl--;
		return true;
	}

	public String toString() {
		String s = "Anzahl der Mitarbeiter: " + this.anzahl + "\n\n";
		Knoten<Typ> mi = this.head.getNaechster();
		while (mi != null) {
			s += mi.getElement().toString()  + "\n";
			mi = mi.getNaechster();
		}
		return s;
	}
	
	public long getRevision(){
		return revision;
	}
	
	public void setRevision(long rev){
		revision = rev;
	}
	
	public long updateRevision(){
		revision++;
		return getRevision();
	}
	
	
	public abstract boolean existiertElement(long id);
	public abstract void sortiere();
	public abstract Typ[] toArray();
	
}
